package org.ocean.online.utils;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.ocean.online.constant.Constant;

public class ModelUtil {

	public static List<Map> generateAddColumnSql(List<Map> newCols,List<Map> oldCols){
		List<Map> addCols = new ArrayList<Map>();
		addCols.addAll(newCols);
		for(Map newCol : newCols){
			for(Map oldCol : oldCols){
				if(oldCol.get(Constant.AttrName_VariableName).equals(newCol.get(Constant.AttrName_VariableName))){
					addCols.remove(newCol);
					break;
				}else if(oldCol.get("uid").equals(newCol.get("uid"))){
					addCols.remove(newCol);
					break;
				}
			}
		}
		return addCols;
	}
	public static List<Map> generateDropColumns(List<Map> newCols,List<Map> oldCols){
		List<Map> dropCols = new ArrayList<Map>();
		for(Map oldCol : oldCols){
			boolean dropFlag=true;
			for(Map newCol : newCols){
				if(oldCol.get("uid").equals(newCol.get("uid"))){
					dropFlag=false;
					break;
				}
			}
			if(dropFlag){
				dropCols.add(oldCol);
			}
		}
		return dropCols;
	}
	public static List<Map> generateAlterColumns(List<Map> newCols,List<Map> oldCols){
		List<Map> alterCols = new ArrayList<Map>();
		for(Map newCol : newCols){
			for(Map oldCol : oldCols){
				if(oldCol.get("uid").equals(newCol.get("uid"))){
					if(!isSame(newCol,oldCol)){
						newCol.put("oldAttrName", oldCol.get(Constant.AttrName_VariableName));
						alterCols.add(newCol);
					}
				}
			}
		}
		return alterCols;
	}
	private static boolean isSame(Map newCol, Map oldCol) {
		for(Object key: newCol.keySet()){
			String oldValue="";
			if(oldCol.get(key)!=null){
				oldValue=oldCol.get(key).toString();
			}
			if(oldValue.equals(newCol.get(key))){
				continue;
			}
			return false;
		}
		return true;
	}
	
	public static void validate(List<Map> columns) {
		Set set = new HashSet();
		for(Map map: columns){
			String field= map.get(Constant.AttrName_VariableName).toString();
			if(set.contains(field)){
				throw new RuntimeException("field ["+field+"]重复");
			}
			set.add(field);
		}
	}

}
